import demo1.Card;
import demo1.CardGame;
import demo2.MySingleList;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * 顺序表
 *      ArrayList的具体使用
 *      ArrayList的缺点
 * linkedList及链表
 *      链表
 */
public class Test {
    /**
    * 链表
    * @param args
    *  链表的概念及结构
    *  单链表不带头非循环链表的实现->demo2演示
    */
    public static void main(String[] args) {
        MySingleList mySingleList = new MySingleList();
        //创建链表
        //mySingleList.createNode();
        //打印链表
        //mySingleList.display();
        //求节点个数
        int count = mySingleList.size();
        System.out.println(count);
        //查找节点key
        boolean flag = mySingleList.contains(45);
        System.out.println(flag);
        //头插
        mySingleList.addFirst(45);
        mySingleList.addFirst(34);
        mySingleList.addFirst(23);
        mySingleList.addFirst(12);
        mySingleList.display();
        //尾插
        mySingleList.addLast(222);
        mySingleList.addLast(222);
        mySingleList.addLast(34);
        mySingleList.addLast(45);
        mySingleList.display();
        //任意位置插入
        mySingleList.addIndex(1,222);
        mySingleList.display();
        //删除指定元素key
        mySingleList.remove(12);
        mySingleList.display();
        //删除所有元素
        mySingleList.removeAllKey(222);
        mySingleList.display();
    }
    public static void main4(String[] args) {
        /**
         * 链表的概念及结构
         *      1.概念:物理存储结构上非连续存储结构(物理上不连续,结构上连续),顺序表(物理上连续,逻辑上连续)
         *      2.结构:共8种,单向 双向 带头 不带头 循环 非循环组成8种.
         *      3.重点理解:单向 不带头 非循环(面试常考),双向 不带头 非循环(LinkedList底层实现)
         */
    }
    public static void main3(String[] args) {
        /**
         * ArrayList的缺点
         *      1.插入删除元素需要进行移动
         *      2.扩容可能造成内存空间的浪费
         *      3.扩容进行拷贝 释放旧空间会造成消耗
         */
    }
    /**
     * 扑克牌->demo1进行实现
     */
    public static void main2(String[] args) {
        CardGame cardGame = new CardGame();

        System.out.println("买牌:");
        List<Card> ret = cardGame.buyCard();
        System.out.println(ret);

        System.out.println("洗牌:");
        cardGame.shuffle(ret);
        System.out.println(ret);

        System.out.println("发牌: ");
        List<List<Card>> ret2 = cardGame.getCard(ret);
        for(int i = 0;i < ret2.size();i++) {
            System.out.println("第"+ (i + 1) + "人牌为: " + ret2.get(i));
        }
        System.out.println("剩余牌为: ");
        System.out.println(ret);
    }
    /**
     * 杨辉三角
     * @param numRows
     * @return
     *      1.理解List<List<Integer>->二维数组(一维数组引用引用一个一维数组)
     *      2.创建数组
     *      3.处理二维数组中的一维数组
     *      4.返回
     */
    public static List<List<Integer>> generate(int numRows) {
        List<List<Integer>> ret = new ArrayList<>();
        List<Integer> list = new ArrayList<>();

        list.add(1);
        ret.add(list);

        for(int i = 1;i < numRows;i++) {
            List<Integer> curRow = new ArrayList<>();
            //处理第一个元素
            curRow.add(1);
            //处理中间元素
            List<Integer> prevRow = ret.get(i - 1);
            for(int j = 1;j < i;j++) {
                int x = prevRow.get(j) + prevRow.get(j - 1);
                curRow.add(x);
            }
            //处理最后一个元素
            curRow.add(1);

            ret.add(curRow);
        }
        return ret;
    }
    public static void main1(String[] args) {
        List<List<Integer>> array = generate(5);
        for(int i = 0;i < array.size();i++) {
            List<Integer> array2 = array.get(i);
            for(int j = 0;j < array2.size();j++) {
                System.out.print(array2.get(j) + " ");
            }
            System.out.println();
        }
    }
}
